package polypeptide;

/*
多态参数
方法定义的形参类型为父类类型，实参类型允许为子类类型

定义员工类Employee,包含姓名和月工资[private],以及计算年工资getAnnual
的方法。普通员工和经理继承了员工,经理类多了奖金bonus属性和管理manage方
法，普通员工类多了work方法，普通员工和经理类要求分别重写getAnnual方法
测试类中添加一个方法showEmpAnnual(Employee e),实现获取任何员工对象的
年工资，并在main方法中调用该方法[e.getAnnual()]
测试类中添加一个方法，testWork,如果是普通员工，则调用work方法，如果是经
理，则调用manage方法/眼高手低..
*/
public class Test {
    public static void main(String[] args) {
        Test t = new Test();
        Manager m = new Manager("jack", 10000, 5000);
        Worker w = new Worker("smith", 5000);
        System.out.println(t.showEmpAnnual(m));
        System.out.println(t.showEmpAnnual(w));
        t.testWork(m);
        t.testWork(w);

    }
    //实现获取任何员工对象的年工资
    public double showEmpAnnual(Employee e){
        //反正方法是动态绑定的，所以直接调用即可
        return e.getAnnual();
    }
    //如果是普通员工，则调用work方法，如果是经理，则调用manage方法
    public void testWork(Employee e){
        //调用特有的方法，需要向下转型，因为编译器不认哦
        if(e instanceof Worker){
            ((Worker) e).work();
        }
        if(e instanceof Manager){
            ((Manager) e).manage();
        }
    }
}
class Employee{
    private String name;
    private double salary;

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }
    public double getAnnual(){
        return  salary*12;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary){
        this.salary = salary;
    }
}
class Worker extends Employee{
    public Worker(String name, double salary) {
        super(name, salary);
    }
    public void work(){
        System.out.println("员工"+getName()+"正在工作");
    }
    //重写获取年薪方法
    public double getAnnual(){
        //普通员工直接调用，因为没有奖金
        return  super.getAnnual();

    }
}

class Manager extends Employee{
    private double bonus;

    public Manager(String name, double salary, double bonus) {
        super(name, salary);
        this.bonus = bonus;
    }

    public double getBonus() {
        return bonus;
    }

    //重写获取年薪方法
    public double getAnnual(){
        //经理加上奖金
        return  super.getAnnual()+bonus;

    }
    //经理的特殊方法，经理可以管理员工
    public void manage(){
        System.out.println("经理"+getName()+"正在管理");
    }
}
